package com.itdfq.algorithm.greedy;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: QianMo
 * @Date: 2021/11/18 13:23
 * @Description: 贪心算法
 * 假设商店中有 3 种商品，它们各自的重量和收益是：
 * 商品 1：重量 10 斤，收益 60 元； a
 * 商品 2：重量 20 斤，收益 100 元；b
 * 商品 3：重量 30 斤，收益 120 元。c
 * <p>
 * 对于每件商品，顾客可以购买商品的一部分（可再分）。一个小偷想到商店行窃，他的背包最多只能装 50 斤的商品，如何选择才能获得最大的收益呢？
 * <p>
 * 贪心算法解决此问题的思路是：计算每个商品的收益率（收益/重量），优先选择收益率最大的商品，直至所选商品的总重量达到 50 斤。
 */
public class Demo1 {
    public static void main(String[] args) {
        count(50);
    }

    /**
     * @param sum 总重量
     */
    public static void count(int sum) {
        List<Profit> list = new ArrayList<>();
        list.add(new Profit('a', 60, 10)); //6  10
        list.add(new Profit('b', 120, 20)); //6 20
        list.add(new Profit('c', 100, 30)); //3.333  20
         List<Profit> profitList = list.stream().sorted(Comparator.comparing(Profit::getProfit).reversed()).collect(Collectors.toList());
        //从大到小
        double allPrice = 0;
        int a = 0;
        int b = 0;
        int c = 0;
        if (sum < profitList.get(0).getSum()) {
            a = sum;
        }
        if (sum < profitList.get(1).getSum() && sum > profitList.get(0).getSum()) {
            a = profitList.get(0).getSum();
            b = sum - a;
        }
        if (sum > profitList.get(1).getSum()) {
            a=profitList.get(0).getSum();
            b=profitList.get(1).getSum();
            c=sum-a-b;
        }

        double sumPrice = a*profitList.get(0).getPrice()+ b*profitList.get(1).getPrice()+ c*profitList.get(2).getPrice();
        System.out.println("收益为："+sumPrice);
    }
    static class Profit {
        char name;
        /**
         * 收益
         */
        double profit;
        int sum;
        /**
         * 单价
         */
        double price;

        public Profit(char name, double profit, int sum) {
            this.name = name;
            this.profit = profit;
            this.sum = sum;

        }

        public int getSum() {
            return sum;
        }

        public void setSum(int sum) {
            this.sum = sum;
        }

        public double getPrice() {

            return profit / sum;
        }

        public void setPrice(double price) {
            this.price = price;
        }

        public char getName() {
            return name;
        }

        public void setName(char name) {
            this.name = name;
        }

        public double getProfit() {
            return profit;
        }

        public void setProfit(double profit) {
            this.profit = profit;
        }
    }
}
